//
//  BSSRequest.m
//  BrightSunnySky
//
//  Created by zhoujunchun on 2019/2/28.
//  Copyright © 2019 PURANG. All rights reserved.
//

#import "BSSRequest.h"

#import "YTKNetworkAgent.h"
#import "BSSMessageCode.h"
#import <sys/utsname.h>

@interface BSSRequest ()
@property (assign, nonatomic) NSUInteger requestNum;// 请求次数
@end

@implementation BSSRequest

- (instancetype)initWithURL:(nonnull NSString *)URLStr
                        dic:(nullable NSDictionary *)dic{
    return [self initWithURL:URLStr
                         dic:dic
               requestMethod:YTKRequestMethodPOST];
}
- (instancetype)initWithURL:(nonnull NSString *)URLStr
                        dic:(nullable NSDictionary *)dic
              requestMethod:(YTKRequestMethod)requestMethod {
    self = [super init];
    if (self) {
        self.requestNum = 0;
        _urlStr =[NSString stringWithFormat:@"%@%@",URL_PATH,URLStr];
        _dic = [NSDictionary dictionaryWithDictionary:dic];
        _requestMethod = requestMethod;
    }
    return self;
}
#pragma mark - override Methods

- (void)startRequest:(BSSRequestBlock)requestBlock{
    
    NSLog(@"\n%@\n%@\n%@\n",[[YTKNetworkAgent sharedAgent] buildRequestUrl:self],self.requestHeaderFieldValueDictionary,self.requestArgument);
    
    [self startWithCompletionBlockWithSuccess:^(YTKBaseRequest *request) {
        
        NSData *jsonData = [request.responseString dataUsingEncoding:NSUTF8StringEncoding];
        NSError *err;
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
                                                            options:NSJSONReadingMutableContainers
                                                              error:&err];
        [self handleSuccess:requestBlock
             responseObject:dic
            responseHeaders:request.responseHeaders];
        
    } failure:^(YTKBaseRequest *request) {
        
        [self handleFailure:requestBlock
                      error:request.error
            responseHeaders:request.responseHeaders];
    }];
}

- (void)handleSuccess:(BSSRequestBlock)requestBlock
       responseObject:(id)responseObject
      responseHeaders:(NSDictionary *)responseHeaders{
    
    dispatch_async(dispatch_get_main_queue(), ^{
        [self printResponseData];
        
        //存储yyttoken
        if ([self.responseHeaders valueForKey:@"yyttoken"]) {
            [[NSUserDefaults standardUserDefaults] setValue:[self.responseHeaders valueForKey:@"yyttoken"] forKey:@"yyttoken"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        
        
        if ([responseObject isKindOfClass:[NSDictionary class]]) {
            
            BSSRequestStatus status;
            if ([responseObject valueForKey:@"code"]) {
                status = [[responseObject valueForKey:@"code"] integerValue];
            } else {
                status = [[responseObject valueForKey:@"responseCode"] integerValue];
            }
            
            NSString *success = responseObject[@"success"];
            if ([success boolValue] == YES ) {
                status = BSSRequestStatusSuccess;
            }
            if ( [[NSString stringWithFormat:@"%@",success] isEqualToString:@"true"]) {
                status = BSSRequestStatusSuccess;
            }
            
            // 返回错误时, 需要解析message。服务器返回的错误没有用, 因为客户端需要显示中文。
            NSString *message = @"";
            if (!IsEmpty(responseObject[@"message"])) {
                message = responseObject[@"message"];
            }else if (!IsEmpty(responseObject[@"errorMsg"])){
                message = responseObject[@"errorMsg"];
            }else if (!IsEmpty(responseObject[@"errorMessage"])){
                message = responseObject[@"errorMessage"];
            }else{
                message = [BSSMessageCode getMesssageWithCode:status];
            }
            
            id object = [self formatResponseObject:responseObject];
            if (requestBlock) {
                requestBlock(status, message, object);
            }
        }
    });
}


- (void)handleFailure:(BSSRequestBlock)requestBlock error:(NSError *)error responseHeaders:(NSDictionary *)responseHeaders{
    dispatch_async(dispatch_get_main_queue(), ^{
        if (requestBlock) {
            NSLog(@"\n statusCode:%ld\n %@", self.responseStatusCode,error);
            [[NSNotificationCenter defaultCenter] postNotificationName:NET_ERROR_NOTIFICATION object:@{@"responseStatusCode" : [@(self.responseStatusCode) stringValue]}];
            // 判断session是否过期
            if ((self.responseStatusCode == 401) && ![self.urlStr containsString:@"login"]){
               
            } else if (self.responseStatusCode == 409) {
                requestBlock(BSSRequestStatusFailure, nil, nil);
            } else {
                
                NSString *msg;
                switch (error.code) {
                    case -1000:
                    case -1002:
                        msg = @"系统异常，请稍后再试";
                        break;
                    case -1001:
                        msg = @"请求超时，请检查您的网络!";
                        break;
                    case -1005:
                    case -1006:
                    case -1009:
                        msg = @"网络异常，请检查您的网络!";
                        break;
                    default:
                        msg = @"服务器异常，请稍候再试!";
                        break;
                }
                requestBlock(error.code, msg, nil);
            }
        }
    });
}

/// (封装层) 解析，把服务器返回数据转换想要的数据
//默认返回原 data
//通常解析body内数据
- (id)formatResponseObject:(id)responseObject{
    return responseObject;
}

#pragma mark - override Getters
- (NSTimeInterval)requestTimeoutInterval{
    return 15;
}

- (YTKRequestMethod)requestMethod{
    return _requestMethod;
}

- (YTKRequestSerializerType)requestSerializerType{
    return YTKRequestSerializerTypeHTTP;
}

- (YTKResponseSerializerType)responseSerializerType{
    return YTKResponseSerializerTypeHTTP;
}

- (NSString *)requestUrl{
    return self.urlStr;
}

- (NSDictionary *)requestHeaderFieldValueDictionary{
    NSMutableDictionary *dicts = [NSMutableDictionary dictionary];
    
    NSString *app_Version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    
    [dicts setValue:@"ios" forKey:@"mobileModel"];
    [dicts setValue:app_Version forKey:@"mobileVersion"];
     
    NSString *yyttoken = [[NSUserDefaults standardUserDefaults] stringForKey:@"yyttoken"];
    if (yyttoken.length) {
        [dicts setValue:yyttoken forKey:@"yyttoken"];
    }
    //设备唯一标识符
    NSString *deviceUUID = [[SensorsAnalyticsSDK sharedInstance] distinctId];
    if (deviceUUID.length) {
        [dicts setValue:deviceUUID forKey:@"deviceUUID"];
    }
    
    // 设备id
    NSString * bundleID = [NSString stringWithFormat:@"%@_uuid",[[NSBundle mainBundle] bundleIdentifier]];
    NSString * uuid = [SSKeychain passwordForService:@"com.BrightSunnySky" account:bundleID];
    if (IsEmpty(uuid)) {
        uuid = [[NSUUID UUID] UUIDString];
        if (!IsEmpty(uuid)) {
            [SSKeychain setPassword: [NSString stringWithFormat:@"%@", uuid]
                         forService:@"com.BrightSunnySky" account:bundleID];
        }
    }
    [dicts setValue:uuid forKey:@"deviceId"];
    
    //手机品牌名称
    NSString *deviceVersionStr = [self getCurrentDeviceModel];
    if (!IsEmpty(deviceVersionStr)) {
        [dicts setValue:deviceVersionStr forKey:@"deviceType"];
    }
    [dicts setValue:@"iPhone" forKey:@"deviceName"];
    // 手机版本
    NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];
    if (!IsEmpty(phoneVersion)) {
        [dicts setValue:phoneVersion forKey:@"deviceVersion"];
    }
    
    NSLog(@"%@",dicts);
    return [dicts copy];
}
 
- (id)requestArgument{
    NSMutableDictionary * dataDic = [NSMutableDictionary dictionary];
    
    NSString *deviceToken = [[NSUserDefaults standardUserDefaults] stringForKey:@"deviceToken"];
    if (!IsEmpty(deviceToken)) {
        [dataDic setValue:deviceToken forKey:@"deviceToken"];
    }
    NSString *getuicid = [[NSUserDefaults standardUserDefaults] stringForKey:@"getuicid"];
    if (!IsEmpty(getuicid)) {
        [dataDic setValue:getuicid forKey:@"getuicid"];
    }
    
    //设备唯一标识符
    NSString *deviceUUID = [[SensorsAnalyticsSDK sharedInstance] distinctId];
    if (deviceUUID.length) {
        [dataDic setValue:deviceUUID forKey:@"deviceUUID"];
    }
    
    [dataDic addEntriesFromDictionary:self.dic];
    return dataDic;
}


#pragma mark ----- private methods

- (void)printResponseData{
    NSData *jsonData;
    if (self.responseJSONObject) {
        jsonData = [NSJSONSerialization dataWithJSONObject:self.responseJSONObject options:NSJSONWritingPrettyPrinted error:nil];
    }
    
    NSString *jsonString;
    if (jsonData) {
        jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }else {
        jsonString = self.responseString;
    }
    NSLog(@"\n%@\n%@",self.responseHeaders,jsonString);
}



 -(NSString *)getCurrentDeviceModel{
   struct utsname systemInfo;
   uname(&systemInfo);
   
   NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding];
   
   
    if ([deviceModel isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
    if ([deviceModel isEqualToString:@"iPhone3,2"])    return @"iPhone 4";
    if ([deviceModel isEqualToString:@"iPhone3,3"])    return @"iPhone 4";
    if ([deviceModel isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([deviceModel isEqualToString:@"iPhone5,1"])    return @"iPhone 5";
    if ([deviceModel isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
    if ([deviceModel isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
    if ([deviceModel isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
    if ([deviceModel isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
    if ([deviceModel isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
    if ([deviceModel isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
    if ([deviceModel isEqualToString:@"iPhone8,4"])    return @"iPhone SE";
    // 日行两款手机型号均为日本独占，可能使用索尼FeliCa支付方案而不是苹果支付
    if ([deviceModel isEqualToString:@"iPhone9,1"])    return @"iPhone 7";
    if ([deviceModel isEqualToString:@"iPhone9,2"])    return @"iPhone 7 Plus";
    if ([deviceModel isEqualToString:@"iPhone9,3"])    return @"iPhone 7";
    if ([deviceModel isEqualToString:@"iPhone9,4"])    return @"iPhone 7 Plus";
    if ([deviceModel isEqualToString:@"iPhone10,1"])   return @"iPhone_8";
    if ([deviceModel isEqualToString:@"iPhone10,4"])   return @"iPhone_8";
    if ([deviceModel isEqualToString:@"iPhone10,2"])   return @"iPhone_8_Plus";
    if ([deviceModel isEqualToString:@"iPhone10,5"])   return @"iPhone_8_Plus";
    if ([deviceModel isEqualToString:@"iPhone10,3"])   return @"iPhone X";
    if ([deviceModel isEqualToString:@"iPhone10,6"])   return @"iPhone X";
    if ([deviceModel isEqualToString:@"iPhone11,8"])   return @"iPhone XR";
    if ([deviceModel isEqualToString:@"iPhone11,2"])   return @"iPhone XS";
    if ([deviceModel isEqualToString:@"iPhone11,6"])   return @"iPhone XS Max";
    if ([deviceModel isEqualToString:@"iPhone11,4"])   return @"iPhone XS Max";
    if ([deviceModel isEqualToString:@"iPhone12,1"])   return @"iPhone 11";
    if ([deviceModel isEqualToString:@"iPhone12,3"])   return @"iPhone 11 Pro";
    if ([deviceModel isEqualToString:@"iPhone12,5"])   return @"iPhone 11 Pro Max";
    if ([deviceModel isEqualToString:@"iPhone12,8"])   return @"iPhone SE2";
    if ([deviceModel isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
    if ([deviceModel isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
    if ([deviceModel isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
    if ([deviceModel isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
    if ([deviceModel isEqualToString:@"iPod5,1"])      return @"iPod Touch (5 Gen)";
    if ([deviceModel isEqualToString:@"iPad1,1"])      return @"iPad";
    if ([deviceModel isEqualToString:@"iPad1,2"])      return @"iPad 3G";
    if ([deviceModel isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad2,2"])      return @"iPad 2";
    if ([deviceModel isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([deviceModel isEqualToString:@"iPad2,4"])      return @"iPad 2";
    if ([deviceModel isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
    if ([deviceModel isEqualToString:@"iPad2,6"])      return @"iPad Mini";
    if ([deviceModel isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPad3,3"])      return @"iPad 3";
    if ([deviceModel isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad3,5"])      return @"iPad 4";
    if ([deviceModel isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
    if ([deviceModel isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
    if ([deviceModel isEqualToString:@"iPad4,4"])      return @"iPad Mini 2 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad4,5"])      return @"iPad Mini 2 (Cellular)";
    if ([deviceModel isEqualToString:@"iPad4,6"])      return @"iPad Mini 2";
    if ([deviceModel isEqualToString:@"iPad4,7"])      return @"iPad Mini 3";
    if ([deviceModel isEqualToString:@"iPad4,8"])      return @"iPad Mini 3";
    if ([deviceModel isEqualToString:@"iPad4,9"])      return @"iPad Mini 3";
    if ([deviceModel isEqualToString:@"iPad5,1"])      return @"iPad Mini 4 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad5,2"])      return @"iPad Mini 4 (LTE)";
    if ([deviceModel isEqualToString:@"iPad5,3"])      return @"iPad Air 2";
    if ([deviceModel isEqualToString:@"iPad5,4"])      return @"iPad Air 2";
    if ([deviceModel isEqualToString:@"iPad6,3"])      return @"iPad Pro 9.7";
    if ([deviceModel isEqualToString:@"iPad6,4"])      return @"iPad Pro 9.7";
    if ([deviceModel isEqualToString:@"iPad6,7"])      return @"iPad Pro 12.9";
    if ([deviceModel isEqualToString:@"iPad6,8"])      return @"iPad Pro 12.9";

    if ([deviceModel isEqualToString:@"AppleTV2,1"])      return @"Apple TV 2";
    if ([deviceModel isEqualToString:@"AppleTV3,1"])      return @"Apple TV 3";
    if ([deviceModel isEqualToString:@"AppleTV3,2"])      return @"Apple TV 3";
    if ([deviceModel isEqualToString:@"AppleTV5,3"])      return @"Apple TV 4";

    if ([deviceModel isEqualToString:@"i386"])         return @"Simulator";
    if ([deviceModel isEqualToString:@"x86_64"])       return @"Simulator";
    return deviceModel;
}
@end
